/**
 * 用户数据全局状态管理
 * 用于存储 login 接口返回的数据，供其他页面使用
 * 
 * 使用示例：
 * 
 * 1. 获取静态数据（不触发请求）：
 *    import { userStore } from '@/api'
 *    const loginData = userStore.getLoginData()
 *    if (loginData) {
 *      // 使用数据
 *      console.log(loginData.nickname)
 *    }
 * 
 * 2. 调用 login 接口（会自动更新全局状态）：
 *    import { login } from '@/api'
 *    const loginRes = await login() // 数据会自动保存到全局状态
 * 
 * 3. 如果需要强制刷新全局数据：
 *    const loginData = userStore.getLoginData(true) // 从本地存储重新加载
 */

import type { SpbLoginResponse } from './apifox/models'

// 存储 key
const STORAGE_KEY = 'user_login_data'
const UPDATE_TIME_KEY = 'user_login_update_time'

// 内存中的状态
const state = {
  loginData: null as SpbLoginResponse | null,
  updateTime: null as number | null
}

/**
 * 从本地存储加载数据
 */
function loadFromStorage() {
  try {
    const dataStr = uni.getStorageSync(STORAGE_KEY)
    const timeStr = uni.getStorageSync(UPDATE_TIME_KEY)
    
    if (dataStr) {
      state.loginData = JSON.parse(dataStr)
    }
    if (timeStr) {
      state.updateTime = parseInt(timeStr, 10)
    }
  } catch (error) {
    console.warn('加载用户数据失败:', error)
    state.loginData = null
    state.updateTime = null
  }
}

/**
 * 保存数据到本地存储
 */
function saveToStorage() {
  try {
    if (state.loginData) {
      uni.setStorageSync(STORAGE_KEY, JSON.stringify(state.loginData))
    } else {
      uni.removeStorageSync(STORAGE_KEY)
    }
    
    if (state.updateTime) {
      uni.setStorageSync(UPDATE_TIME_KEY, state.updateTime.toString())
    } else {
      uni.removeStorageSync(UPDATE_TIME_KEY)
    }
  } catch (error) {
    console.warn('保存用户数据失败:', error)
  }
}

// 初始化时从本地存储加载
loadFromStorage()

export const userStore = {
  /**
   * 获取登录数据（从内存或本地存储读取，不触发请求）
   * @param forceRefresh 是否强制刷新（忽略缓存，从本地存储重新加载）
   * @returns 登录数据，如果不存在则返回 null
   */
  getLoginData(forceRefresh: boolean = false): SpbLoginResponse | null {
    if (forceRefresh) {
      loadFromStorage()
    }
    return state.loginData
  },
  
  /**
   * 设置登录数据（通常在 login 接口调用成功后调用）
   * @param data 登录响应数据
   */
  setLoginData(data: SpbLoginResponse | null) {
    state.loginData = data
    state.updateTime = data ? Date.now() : null
    saveToStorage()
    console.log('用户数据已更新到全局状态')
  },
  
  /**
   * 更新登录数据（调用 login 接口并更新状态）
   * @param loginFn login 接口函数
   * @param showLoading 是否显示加载提示（默认 true）
   * @returns 更新后的登录数据
   */
  async updateLoginData(
    loginFn: (data?: Record<string, any>) => Promise<SpbLoginResponse>,
    showLoading: boolean = true
  ): Promise<SpbLoginResponse> {
    const loginRes = await loginFn({})
    this.setLoginData(loginRes)
    return loginRes
  },
  
  /**
   * 清除登录数据
   */
  clearLoginData() {
    this.setLoginData(null)
  },
  
  /**
   * 获取数据更新时间
   */
  getUpdateTime(): number | null {
    return state.updateTime
  }
}

